package br.com.pnfp.web.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.pnfp.web.model.dao.ICupomDAO;
import br.com.pnfp.web.model.enums.TipoUsuario;
import br.com.pnfp.web.model.vo.Cupom;
import br.com.pnfp.web.model.vo.Doador;
import br.com.pnfp.web.model.vo.Entidade;
import br.com.pnfp.web.model.vo.Usuario;
import br.com.pnfp.web.model.vo.report.QtdeCupomUsuario;

@Repository
public class CupomDAO extends DAO implements ICupomDAO {

	@Override
	public void incluir(Cupom vo) {
		Integer entidade = null;
		if(vo.getEntidade() != null) {
			entidade = vo.getEntidade().getCodigo();
		}
		String sql = "INSERT INTO tb_cupom(cd_doador, cd_entidade, dc_codigo_cupom, dt_cupom, vl_cupom, dt_cadastro, cd_usuario_cadastro, id_enviado) values(?,?,?,?,?,?,?,?)";
		update(sql, new Object[] {
				vo.getDoador().getCodigo(),
				entidade,
				vo.getCoo(),
				vo.getData(),
				vo.getValor(),
				new Date(),
				vo.getUsuarioSistema().getCodigo(),
				0});
	}
	
	@Override
	public void alterar(Cupom vo) {
		String sql = "UPDATE tb_cupom set dt_cupom = ?, vl_cupom = ?, dc_codigo_cupom = ? where cd_cupom = ?";
		update(sql, new Object[] {vo.getData(), vo.getValor(), vo.getCoo(), vo.getCodigo()});	
	}
	
	@Override
	public void excluir(Integer codigo) {
		String sql = "DELETE FROM tb_cupom where cd_cupom = ?";
		update(sql, new Object[] {codigo});
	}
	
	@Override
	public List<Cupom> consultar(Cupom vo) {
		List<Object> params = new ArrayList<Object>();
		String sql = "SELECT cupom.cd_cupom, cupom.cd_doador, doador.dc_cnpj, doador.dc_razao_social, cupom.cd_usuario_cadastro, usuario.dc_login, usuario.nm_usuario, cupom.dt_cupom, cupom.dc_codigo_cupom, cupom.vl_cupom, cupom.dt_cadastro  ";
		sql += "FROM tb_cupom cupom, tb_doador doador, tb_usuario usuario ";
		sql += "WHERE cupom.cd_doador = doador.cd_doador and cupom.cd_usuario_cadastro = usuario.cd_usuario and usuario.cd_empresa = ? ";
		params.add(vo.getUsuarioSistema().getEmpresa().getCodigo());
		
		if(vo.getCodigo() != null && vo.getCodigo()> 0) {
			sql += "and cupom.cd_cupom = ? ";
			params.add(vo.getCodigo());
		} else {		
			sql += "and DATE(cupom.dt_cadastro) >= DATE(?) ";
			params.add(vo.getDataDe());
			sql += "and DATE(cupom.dt_cadastro) <= DATE(?) ";		
			params.add(vo.getDataAte());
		}
		
		sql += "ORDER BY cupom.dt_cadastro desc";
		
		List<Cupom> list = query(sql, params.toArray(), new RowMapper<Cupom>() {
			@Override
			public Cupom mapRow(ResultSet rs, int arg1) throws SQLException {
				Cupom vo = new Cupom();
				vo.setCodigo(rs.getInt("cupom.cd_cupom"));
				vo.setCoo(rs.getString("cupom.dc_codigo_cupom"));
				vo.setData(rs.getDate("cupom.dt_cupom"));
				vo.setCadastro(rs.getDate("cupom.dt_cadastro"));
				vo.setValor(rs.getDouble("cupom.vl_cupom"));
				vo.setDoador(new Doador(rs.getInt("cupom.cd_doador")));
				vo.getDoador().setRazaoSocial(rs.getString("doador.dc_razao_social"));
				vo.getDoador().setCnpj(rs.getString("doador.dc_cnpj"));
				vo.setUsuarioCadastro(new Usuario(rs.getInt("cupom.cd_usuario_cadastro")));
				vo.getUsuarioCadastro().setLogin(rs.getString("usuario.dc_login"));
				vo.getUsuarioCadastro().setNome(rs.getString("usuario.nm_usuario"));
				return vo;
			}
		});
		return list;
	}
	
	@Override
	public void consultaQtdeCupom(QtdeCupomUsuario vo) {
		
		List<Object> params = new ArrayList<Object>();
		String sql = "SELECT cupom.dc_codigo_cupom, cupom.dt_cupom, cupom.dt_cadastro, cupom.vl_cupom, cupom.cd_doador, doador.dc_razao_social, doador.dc_cnpj, cupom.cd_usuario_cadastro, usuario.nm_usuario, usuario.dc_login ";
		sql += "FROM tb_cupom cupom, tb_usuario usuario, tb_doador doador ";
		sql += "WHERE cupom.cd_usuario_cadastro = usuario.cd_usuario and cupom.cd_doador = doador.cd_doador and usuario.cd_empresa = ? ";
		
		params.add(vo.getUsuarioSistema().getEmpresa().getCodigo());
		
		if(vo.getUsuarioSistema().getTipo().equals(TipoUsuario.DIGITADOR)) {
			sql += "and cupom.cd_usuario_cadastro = ? ";
			params.add(vo.getUsuarioSistema().getCodigo());
		}
		
		if(vo.getTipoConsulta() == 1) { //Data de Cadastro
			sql += "and DATE(cupom.dt_cadastro) >= DATE(?) ";
			params.add(vo.getDataDe());
			sql += "and DATE(cupom.dt_cadastro) <= DATE(?) ";		
			params.add(vo.getDataAte());	
		} else { //Data do Cupom
			sql += "and DATE(cupom.dt_cupom) >= DATE(?) ";
			params.add(vo.getDataDe());
			sql += "and DATE(cupom.dt_cupom) <= DATE(?) ";		
			params.add(vo.getDataAte());
		}
		
		sql += "ORDER BY cupom.dt_cadastro, usuario.nm_usuario";
		
		List<Cupom> result = query(sql, params.toArray(), new RowMapper<Cupom>() {
			@Override
			public Cupom mapRow(ResultSet rs, int arg1) throws SQLException {
				Cupom vo = new Cupom();
				vo.setCoo(rs.getString("cupom.dc_codigo_cupom"));
				vo.setData(rs.getDate("cupom.dt_cupom"));
				vo.setCadastro(rs.getDate("cupom.dt_cadastro"));
				vo.setValor(rs.getDouble("cupom.vl_cupom"));
				vo.setDoador(new Doador(rs.getInt("cupom.cd_doador")));
				vo.getDoador().setRazaoSocial(rs.getString("doador.dc_razao_social"));
				vo.getDoador().setCnpj(rs.getString("doador.dc_cnpj"));
				vo.setUsuarioCadastro(new Usuario(rs.getInt("cupom.cd_usuario_cadastro")));
				vo.getUsuarioCadastro().setLogin(rs.getString("usuario.dc_login"));
				vo.getUsuarioCadastro().setNome(rs.getString("usuario.nm_usuario"));
				return vo;
			}
		});
		vo.setCupons(result);		
	}
	
	@Override
	public Integer consultaQtdeCupomParaEnvio(Usuario usuario, Integer codigoEntidade) {
		String sql = "SELECT count(cupom.cd_cupom) ";
		sql += "FROM tb_cupom cupom ";
		sql += "WHERE cupom.cd_entidade =  ? and cupom.id_enviado = ? ";
		
		return queryForInt(sql, codigoEntidade, 0);
	}
	
	@Override
	public Integer consultaQtdeCupomSemAssociacao(Usuario usuario) {
		String sql = "SELECT count(cupom.cd_cupom) ";
		sql += "FROM tb_cupom cupom, tb_usuario usuario ";
		sql += "WHERE cupom.cd_usuario_cadastro = usuario.cd_usuario and cupom.cd_entidade IS NULL and usuario.cd_empresa = ?";
		
		return queryForInt(sql, usuario.getEmpresa().getCodigo());
	}
	
	@Override
	public List<Cupom> consultaCupomParaEnvio(Usuario usuario, Integer codigoEntidade) {
		String sql = "SELECT cupom.cd_cupom, usuario.dc_login, doador.dc_cnpj, cupom.dt_cupom, cupom.dc_codigo_cupom, cupom.vl_cupom, entidade.dc_razao_social ";
		sql += "FROM tb_cupom cupom, tb_usuario usuario, tb_doador doador, tb_entidade entidade ";
		sql += "WHERE cupom.cd_usuario_cadastro = usuario.cd_usuario and cupom.cd_doador = doador.cd_doador and entidade.cd_entidade = cupom.cd_entidade and ";
		sql += "cupom.id_enviado = ? and entidade.cd_entidade = ? ";
		sql += "ORDER BY cupom.dt_cupom, cupom.vl_cupom desc, doador.dc_cnpj";
		
		List<Cupom> list = query(sql, new Object[]{0, codigoEntidade}, new RowMapper<Cupom>() {
			@Override
			public Cupom mapRow(ResultSet rs, int arg1) throws SQLException {
				Cupom cupom = new Cupom();
				cupom.setCodigo(rs.getInt("cupom.cd_cupom"));
				cupom.setUsuarioCadastro(new Usuario());
				cupom.getUsuarioCadastro().setLogin(rs.getString("usuario.dc_login"));
				cupom.setDoador(new Doador());
				cupom.getDoador().setCnpj(rs.getString("doador.dc_cnpj"));
				cupom.setData(rs.getDate("cupom.dt_cupom"));
				cupom.setCoo(rs.getString("cupom.dc_codigo_cupom"));
				cupom.setValor(rs.getDouble("cupom.vl_cupom"));
				cupom.setEntidade(new Entidade());
				cupom.getEntidade().setRazaoSocial(rs.getString("entidade.dc_razao_social"));
				return cupom;
			}
		});
		return list;
	}
	
	@Override
	public void atualizaEnvioCupom(Integer id, Date data) {
		String sql = "UPDATE tb_cupom SET dt_envio_sefaz = ?, id_enviado = ? where cd_cupom = ?";
		update(sql, new Object[] {data, 1, id});
	}
	
	@Override
	public List<Cupom> consultaCupomLancadosHoje(Usuario usuario) {
		String sql = "SELECT cupom.cd_cupom, doador.dc_cnpj, cupom.dt_cupom, cupom.dc_codigo_cupom, cupom.vl_cupom ";
		sql += "FROM tb_cupom cupom, tb_doador doador ";
		sql += "WHERE cupom.cd_usuario_cadastro = ? and cupom.cd_doador = doador.cd_doador and DATE(cupom.dt_cadastro) = CURDATE() ";
		sql += "ORDER BY cupom.dt_cadastro desc";
		
		List<Cupom> list = query(sql, new Object[]{usuario.getCodigo()}, new RowMapper<Cupom>() {
			@Override
			public Cupom mapRow(ResultSet rs, int arg1) throws SQLException {
				Cupom cupom = new Cupom();
				cupom.setCodigo(rs.getInt("cupom.cd_cupom"));
				cupom.setDoador(new Doador());
				cupom.getDoador().setCnpj(rs.getString("doador.dc_cnpj"));
				cupom.setData(rs.getDate("cupom.dt_cupom"));
				cupom.setCoo(rs.getString("cupom.dc_codigo_cupom"));
				cupom.setValor(rs.getDouble("cupom.vl_cupom"));
				return cupom;
			}
		});
		return list;
	}
	
	@Override
	public Cupom validaCupomCadastrado(Cupom vo) {
		String sql = "SELECT cupom.dt_cadastro ";
		sql += "FROM tb_cupom cupom ";
		sql += "WHERE cupom.cd_doador = ? and DATE(cupom.dt_cupom) = STR_TO_DATE(?, '%d/%m/%Y') and cupom.dc_codigo_cupom = ? ";
		sql += "ORDER BY cupom.dt_cadastro";
		
		Object[] params = new Object[]{vo.getDoador().getCodigo(), sdf.format(vo.getData()), vo.getCoo()};
		
		List<Cupom> list = query(sql, params, new RowMapper<Cupom>() {
			@Override
			public Cupom mapRow(ResultSet rs, int arg1) throws SQLException {
				Cupom cupom = new Cupom();
				cupom.setCadastro(rs.getTimestamp("cupom.dt_cadastro"));
				return cupom;
			}
		});
		
		if(list.size() > 0) {
			return list.get(0);
		}
		return null;		
	}

}
